//package com.hfb.mashibing.alip8.diamondsquarealgorithm.class10;
//
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
//public class Code07_MergeUsers {
//
//    static class User {
//        public String a;
//        public String b;
//        public String c;
//
//        public User(String a, String b, String c) {
//            this.a = a;
//            this.b = b;
//            this.c = c;
//        }
//    }
//    static class UnionSet<V> {
//        public void union(V a, V b) {
//            if (!nodes.containsKey(a) || !nodes.containsKey(b)){
//                return;
//            }
//            Node<V> aHead = findFather(nodes.get(a));
//            Node<V> bHead = findFather(nodes.get(b));
//            if (aHead != bHead) {
//                int aSetSize = sizeMap.get(aHead);
//                int bSetSize = sizeMap.get(bHead);
//
//                Node<V> big = aSetSize >= bSetSize ? aHead : bHead;
//                Node<V> samll = big==aHead ? aHead : bHead;
//                parents.put(samll,big);
//                sizeMap.put(big,aSetSize+bSetSize);
//                sizeMap.remove(small);
//            }
//        }
//    }
//    static class UnionFind<V> {
//        HashMap<User, User> nodes = new HashMap<>();
//        HashMap<Node, Node> parents = new HashMap<>();
//        HashMap<User, Integer> sizeMap = new HashMap<>();
//
//        public boolean isSameSet(V a, V b) {
//            if (!nodes.containsKey(a) || !nodes.containsKey(b)){
//                return false;
//            }
//            return findFather(nodes.get(a)) == findFather(nodes.get(b));
//        }
//
//        public V findFather(User user) {
//
//            return null;
//        }
//        public void union(V a, V b) {
//            if (!nodes.containsKey(a) || !nodes.containsKey(b)){
//                return;
//            }
//            Node<V> aHead = findFather(nodes.get(a));
//            Node<V> bHead = findFather(nodes.get(b));
//            if (aHead != bHead) {
//                int aSetSize = sizeMap.get(aHead);
//                int bSetSize = sizeMap.get(bHead);
//
//                Node<V> big = aSetSize >= bSetSize ? aHead : bHead;
//                Node<V> samll = big==aHead ? aHead : bHead;
//                parents.put(samll,big);
//                sizeMap.put(big,aSetSize+bSetSize);
//                sizeMap.remove(small);
//            }
//        }
//        public int getSetNum(){
//            return sizeMap.size();
//        }
//    }
//
//
//    /**
//     * 如果2个user，a字段一样，or b字段一样 or
//     * c字段一样就认为是一个人
//     * 请合并users，返回合并之后的用户数量
//     * @param users
//     * @return
//     */
//    public static int mergeUsers(List<User> users){
//        UnionSet<User> unionFind = new UnionSet();
//        HashMap<String, User> mapA = new HashMap<>();
//        HashMap<String, User> mapB = new HashMap<>();
//        HashMap<String, User> mapC = new HashMap<>();
//        for (User user:users) {
//            if (mapA.containsKey(user.a)){
//                unionFind.union(user,mapA.get(user.a));
//            }else{
//                mapA.put(user.a,user);
//            }
//
//            if (mapB.containsKey(user.b)){
//                unionFind.union(user,mapB.get(user.b));
//            }else{
//                mapB.put(user.a,user);
//            }
//
//            if (mapC.containsKey(user.c)){
//                unionFind.union(user,mapC.get(user.c));
//            }else{
//                mapC.put(user.c,user);
//            }
//        }
//        // 向并查集询问，合并之后，还有多少个集合？
//        return unionFind.getSetNum();
//    }
//
//}
